import mongoose, { Document, Schema } from 'mongoose';
export interface IDic extends Document {
    type: string;
    value: mongoose.Schema.Types.Mixed,
    label: string;
    sort: number;
    isActive: boolean;
    isDefault?: boolean;
    remark?: string;
    createdAt?: Date;
    updatedAt?: Date;
    createdBy: mongoose.Schema.Types.ObjectId,
    updatedBy?: mongoose.Schema.Types.ObjectId,
}

const dicSchema = new Schema<IDic>({
    // 字典类型（分组标识，如 'user_status', 'gender'）
    type: {
        type: String,
        required: [true, '字典项类型是必填项'],
        trim: true,
        index: true
    },
    // 实际存储值（业务表中保存的值）
    value: {
        type: mongoose.Schema.Types.Mixed, // 支持 string / number / boolean
        required: [true, '字典项值是必填项'],
    },
    // 展示文本（前端显示用）
    label: {
        type: String,
        required: [true, '字典项标签是必填项'],
        trim: true
    },
    // 排序权重（越小越靠前）
    sort: {
        type: Number,
        default: 0
    },
    // 是否启用
    isActive: {
        type: Boolean,
        default: true
    },
    // 是否为默认值（可选）
    isDefault: {
        type: Boolean,
        default: false
    },
    // 备注
    remark: {
        type: String,
        trim: true,
        minlength: [2, '字典项备注至少需要2个字符'],
        maxlength: [200, '字典项备注不能超过200个字符']
    },
    createdBy: {
        type: mongoose.Schema.Types.ObjectId,
        ref: 'User',
    },
    updatedBy: {
        type: mongoose.Schema.Types.ObjectId,
        ref: 'User',
    },
}, {
    timestamps: true // 自动添加 createdAt 和 updatedAt2
});

// 如果需要考虑租户隔离（多租户系统），可以添加 tenantId 到唯一索引中
dicSchema.index({ type: 1, label: 1, tenantId: 1 }, { unique: true });

// 虚拟字段（不存储在数据库中）
dicSchema.virtual('displayName').get(function () {
    return `${this.label} (${this.type})`;
});

// 实例方法
dicSchema.methods.toJSON = function () {
    const Dic = this.toObject();
    return Dic;
};

// 静态方法
dicSchema.statics.findByType = function (type: string) {
    return this.find({ type, isActive: true });
};

export const DicModel = mongoose.model<IDic>('Dic', dicSchema);
